/// 📊 格式化工具类
/// 统一管理数字、文本等格式化逻辑
/// 
/// 提供企业级的数字格式化功能，包括：
/// - 大数字万位显示（w）
/// - 千位逗号分隔
/// - 小数点优化处理
class FormatUtil {
  /// 数字格式化函数 - 企业级格式化规则
  /// 
  /// 格式化规则：
  /// - >= 10万：显示1位小数w，去掉末尾的.0
  ///   例如: 150000 → "15w", 123456 → "12.3w"
  /// - >= 1万 且 < 10万：显示2位小数w，去掉末尾的0
  ///   例如: 12345 → "1.23w", 10000 → "1w"
  /// - >= 1千 且 < 1万：加逗号分隔
  ///   例如: 5000 → "5,000", 1234 → "1,234"
  /// - < 1千：直接显示
  ///   例如: 500 → "500"
  /// 
  /// @param number - 待格式化的数字
  /// @returns 格式化后的字符串
  static String formatNumber(int number) {
    if (number >= 100000) {
      // >= 10万: 显示1位小数w，去掉末尾的.0
      double result = number / 10000.0;
      String formatted = result.toStringAsFixed(1);
      if (formatted.endsWith('.0')) {
        formatted = formatted.substring(0, formatted.length - 2);
      }
      return '${formatted}w';
    } else if (number >= 10000) {
      // >= 1万 且 < 10万: 显示2位小数w，去掉末尾的0
      double result = number / 10000.0;
      String formatted = result.toStringAsFixed(2);
      formatted = formatted.replaceAll(RegExp(r'\.?0+$'), '');
      return '${formatted}w';
    } else if (number >= 1000) {
      // >= 1千 且 < 1万: 加逗号分隔
      return number.toString().replaceAllMapped(
        RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'),
        (Match match) => '${match[1]},',
      );
    } else {
      // < 1千: 直接显示
      return number.toString();
    }
  }

  /// 格式化积分显示
  /// 
  /// 积分专用格式化方法，内部调用 formatNumber
  /// @param points - 积分数值
  /// @returns 格式化后的积分字符串
  static String formatPoints(int points) {
    return formatNumber(points);
  }

  /// 格式化粉丝数显示
  /// 
  /// 粉丝数专用格式化方法，内部调用 formatNumber
  /// @param followers - 粉丝数值
  /// @returns 格式化后的粉丝数字符串
  static String formatFollowers(int followers) {
    return formatNumber(followers);
  }

  /// 格式化点赞数显示
  /// 
  /// 点赞数专用格式化方法，内部调用 formatNumber
  /// @param likes - 点赞数值
  /// @returns 格式化后的点赞数字符串
  static String formatLikes(int likes) {
    return formatNumber(likes);
  }

  /// 格式化金额显示（保留2位小数）
  /// 
  /// 金额格式化规则：
  /// - 始终保留2位小数
  /// - 添加千位分隔符
  /// 
  /// @param amount - 金额数值
  /// @returns 格式化后的金额字符串（如: "1,234.56"）
  static String formatMoney(double amount) {
    String formatted = amount.toStringAsFixed(2);
    List<String> parts = formatted.split('.');
    
    // 整数部分添加千位分隔符
    String integerPart = parts[0].replaceAllMapped(
      RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'),
      (Match match) => '${match[1]},',
    );
    
    return '$integerPart.${parts[1]}';
  }

  /// 格式化百分比显示
  /// 
  /// @param value - 百分比数值（0-100）
  /// @param decimals - 保留小数位数，默认1位
  /// @returns 格式化后的百分比字符串（如: "45.5%"）
  static String formatPercentage(double value, {int decimals = 1}) {
    return '${value.toStringAsFixed(decimals)}%';
  }

  /// 格式化文件大小显示
  /// 
  /// @param bytes - 字节大小
  /// @returns 格式化后的文件大小字符串（如: "1.23 MB"）
  static String formatFileSize(int bytes) {
    if (bytes < 1024) {
      return '$bytes B';
    } else if (bytes < 1024 * 1024) {
      double kb = bytes / 1024;
      return '${kb.toStringAsFixed(2)} KB';
    } else if (bytes < 1024 * 1024 * 1024) {
      double mb = bytes / (1024 * 1024);
      return '${mb.toStringAsFixed(2)} MB';
    } else {
      double gb = bytes / (1024 * 1024 * 1024);
      return '${gb.toStringAsFixed(2)} GB';
    }
  }

  /// 格式化时间长度显示
  /// 
  /// @param seconds - 秒数
  /// @returns 格式化后的时间字符串（如: "1:23:45"）
  static String formatDuration(int seconds) {
    int hours = seconds ~/ 3600;
    int minutes = (seconds % 3600) ~/ 60;
    int secs = seconds % 60;
    
    if (hours > 0) {
      return '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${secs.toString().padLeft(2, '0')}';
    } else {
      return '${minutes.toString().padLeft(2, '0')}:${secs.toString().padLeft(2, '0')}';
    }
  }

  /// 🔥 企业级聊天时间格式化（智能相对时间）
  /// 
  /// 格式化规则：
  /// - < 1分钟：刚刚
  /// - < 1小时：N分钟前
  /// - 今天（< 1天）：HH:mm
  /// - 昨天（< 2天）：昨天 HH:mm
  /// - 一周内（< 7天）：N天前
  /// - 超过一周：MM-dd HH:mm
  /// 
  /// @param time - DateTime对象
  /// @returns 格式化后的时间字符串
  static String formatChatTime(DateTime time) {
    final now = DateTime.now();
    final difference = now.difference(time);
    
    // 1分钟内：刚刚
    if (difference.inMinutes < 1) {
      return '刚刚';
    } 
    // 1小时内：N分钟前
    else if (difference.inHours < 1) {
      return '${difference.inMinutes}分钟前';
    } 
    // 今天：HH:mm
    else if (difference.inDays < 1) {
      return '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}';
    } 
    // 昨天：昨天 HH:mm
    else if (difference.inDays < 2) {
      return '昨天 ${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}';
    } 
    // 一周内：N天前
    else if (difference.inDays < 7) {
      return '${difference.inDays}天前';
    } 
    // 超过一周：MM-dd HH:mm
    else {
      return '${time.month.toString().padLeft(2, '0')}-${time.day.toString().padLeft(2, '0')} ${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}';
    }
  }

  /// 🔥 格式化聊天时间（从时间戳）
  /// 
  /// @param timestamp - 毫秒时间戳
  /// @returns 格式化后的时间字符串
  static String formatChatTimeFromTimestamp(int timestamp) {
    return formatChatTime(DateTime.fromMillisecondsSinceEpoch(timestamp));
  }

  /// 格式化完整日期时间
  /// 
  /// @param time - DateTime对象
  /// @param showSeconds - 是否显示秒，默认false
  /// @returns 格式化后的日期时间字符串（如: "2024-10-19 14:30" 或 "2024-10-19 14:30:45"）
  static String formatDateTime(DateTime time, {bool showSeconds = false}) {
    final year = time.year.toString();
    final month = time.month.toString().padLeft(2, '0');
    final day = time.day.toString().padLeft(2, '0');
    final hour = time.hour.toString().padLeft(2, '0');
    final minute = time.minute.toString().padLeft(2, '0');
    
    if (showSeconds) {
      final second = time.second.toString().padLeft(2, '0');
      return '$year-$month-$day $hour:$minute:$second';
    } else {
      return '$year-$month-$day $hour:$minute';
    }
  }

  /// 格式化日期（不含时间）
  /// 
  /// @param time - DateTime对象
  /// @returns 格式化后的日期字符串（如: "2024-10-19"）
  static String formatDate(DateTime time) {
    final year = time.year.toString();
    final month = time.month.toString().padLeft(2, '0');
    final day = time.day.toString().padLeft(2, '0');
    return '$year-$month-$day';
  }

  /// 格式化时间（不含日期）
  /// 
  /// @param time - DateTime对象
  /// @param showSeconds - 是否显示秒，默认false
  /// @returns 格式化后的时间字符串（如: "14:30" 或 "14:30:45"）
  static String formatTime(DateTime time, {bool showSeconds = false}) {
    final hour = time.hour.toString().padLeft(2, '0');
    final minute = time.minute.toString().padLeft(2, '0');
    
    if (showSeconds) {
      final second = time.second.toString().padLeft(2, '0');
      return '$hour:$minute:$second';
    } else {
      return '$hour:$minute';
    }
  }
}

